package com.ygxsk.carhome.utils;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Shader;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.ClickUtils;
import com.blankj.utilcode.util.ColorUtils;
import com.blankj.utilcode.util.DeviceUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.NotificationUtils;
import com.blankj.utilcode.util.PathUtils;
import com.blankj.utilcode.util.ScreenUtils;
import com.blankj.utilcode.util.SpanUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.flyco.roundview.RoundTextView;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.XXPermissions;
import com.kongzue.dialogx.dialogs.PopTip;
import com.tencent.mmkv.MMKV;
import com.yalantis.ucrop.UCrop;
import com.ygxsk.carhome.R;
import com.ygxsk.carhome.constant.ConstantApi;
import com.ygxsk.carhome.constant.ConstantSign;
import com.ygxsk.carhome.constant.ExtraValue;
import com.ygxsk.carhome.event.SingleHomeNewPrivacyAgreement;
import com.ygxsk.carhome.listener.AuthorityCallbackListener;
import com.ygxsk.carhome.listener.Delivery;
import com.ygxsk.carhome.listener.DoSomeThingListener;
import com.ygxsk.carhome.listener.MianTaskManager;
import com.ygxsk.carhome.listener.SequenceListener;
import com.ygxsk.carhome.listener.XXPermissionsDialogDimss;
import com.ygxsk.carhome.response.CouponCustomerVo;
import com.ygxsk.carhome.retrofit.AddLogUpLoadInfo;
import com.ygxsk.carhome.retrofit.ApiException;
import com.ygxsk.carhome.retrofit.ApiRequestSubListener;
import com.ygxsk.carhome.retrofit.ApiService;
import com.ygxsk.carhome.retrofit.ErrorConsumer;
import com.ygxsk.carhome.retrofit.NetworkManager;
import com.ygxsk.carhome.retrofit.ResponseTransformer;
import com.ygxsk.carhome.sys.PermissionInterceptor;
import com.ygxsk.carhome.sys.Session;
import com.ygxsk.carhome.ui.ErrorActivity;
import com.ygxsk.carhome.ui.usercenter.LoginCarActivity;
import com.ygxsk.integrated.retrofit.Parameterkey;

import org.greenrobot.eventbus.EventBus;

import java.io.File;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.bingoogolapple.photopicker.activity.BGAPhotoPreviewActivity;
import cn.bingoogolapple.photopicker.widget.BGANinePhotoLayout;
import io.reactivex.rxjava3.functions.Consumer;
import okhttp3.MediaType;
import okhttp3.RequestBody;

/**
 * Autuhor:Administrator
 * Time:2021/10/14 0014  10:28
 * Description: this is 添加一个新的工具类 分担CommUtils的工具类
 */
//@AndroidEntryPoint
public class CommTools {

//    @Inject
//    static
//    ApiService apiServiceInCommTools;

    //添加友盟默认的播放声音的音频文件路径：
//    public static final String SOUND_PATH = "android.resource://com.dgj.propertysmart/raw/umeng_push_notification_default_sound";

    private static MaterialDialog materialDialogTools;


    public static void methodHandlerSuccessInResponse20000(String messageFromServer) {

         /*{
             "code":"20000",
              "data":{5
              "beginTime":"2021-10-11 00:00:00",
              "endTime":"2021-10-17 23:59:59",
              "list":[]
                   },
               "message":"success"
                 }*/

        if (TextUtils.equals(messageFromServer, "success")) {

            //LogUtils.d("itchen----执行到了 success");

            return;
        }

    }


    /**
     * 拨打手机号码的内容.
     */
//    public static void methodPhone(Context _context, String _userPhone, AlertView _alertView, PermissionSetting _setting) {
//
//        //联系电话
//        //CommUtils.setText(textviewRoomPhonework, userPhone);
//
//        if (!TextUtils.isEmpty(_userPhone)) {
//
//            //LogUtils.d("itchen----电话号码是-->" + _userPhone);
//            CommUtils.checkDialog(_alertView);
//
//            //二次确认弹窗提示
//            _alertView = new AlertView(ConstantSign.ALERTVIEW_TITLE_FOR_PHONE,//
//                    _userPhone, //
//                    ConstantSign.ALERTVIEW_LEFT_CANCEL,//
//                    new String[]{ConstantSign.ALERTVIEW_RIGHT_COPY_INFORMATION}, //
//                    null, //
//                    _context, //
//                    AlertView.Style.Alert,//
//                    new OnItemClickListener() {
//                        @Override
//                        public void onItemClick(Object o, int position) {
//
//                            if (position != AlertView.CANCELPOSITION) {
//
//                                if (!TextUtils.isEmpty(_userPhone)) {
//                                    _context.startActivity(CommUtils.callThePhoneNumAction_dial(_userPhone));
//                                } else {
//                                    ToastUtils.showShort(StringUtils.getString(R.string.getphoneinfofail));
//                                }
//
////                                if (!AndPermission.hasPermissions(_context, Permission.CALL_PHONE)) {
////
////                                    CommUtils.authorityRequest((Activity) _context, ConstantApi.MATERIALDIALOG_AUTHORITY_CONTENT_CALLPHONE, new AuthorityCallbackListener() {
////                                        @Override
////                                        public void doSomeThing() {
////
////                                            //拨打电话的信息：维修人 给业主电话
////                                            AndPermission.with(_context)//
////                                                    .runtime()//
////                                                    .permission(Permission.CALL_PHONE)//
////                                                    .rationale(new RuntimeRationale())//
////                                                    .onGranted(new com.yanzhenjie.permission.Action<List<String>>() {
////
////                                                        @Override
////                                                        public void onAction(List<String> permissions) {
////
////                                                            //弹窗一个二次确认。
////                                                            //要不要添加二次拨打电话的弹窗确认？
////                                                            //不太严谨
////                                                            //mActivityInstance.startActivity(CommUtils.callThePhoneNum(userPhone));
////
////                                                            if (!TextUtils.isEmpty(_userPhone)) {
////                                                                _context.startActivity(CommUtils.callThePhoneNum(_userPhone));
////                                                            } else {
////                                                                CommUtils.displayToastShort(_context, "未获取到电话信息");
////                                                            }
////
////                                                        }
////                                                    }).onDenied(new com.yanzhenjie.permission.Action<List<String>>() {
////                                                        @Override
////                                                        public void onAction(List<String> permissions) {
////
////                                                            CommUtils.displayToastShort(_context, ConstantApi.NEEDPERMISS_PHONE);
////
////                                                            if (AndPermission.hasAlwaysDeniedPermission(_context, permissions)) {
////                                                                _setting.showSetting(ConstantApi.PERMISSION_NORMAL, (Activity) _context, permissions);
////                                                            }
////
////                                                        }
////                                                    }).start();
////                                        }
////                                    });
////
////                                } else {
////
////                                    if (!TextUtils.isEmpty(_userPhone)) {
////                                        _context.startActivity(CommUtils.callThePhoneNum(_userPhone));
////                                    } else {
////                                        CommUtils.displayToastShort(_context, "未获取到电话信息");
////                                    }
////
////                                }
//
//
//                            }
//                        }
//                    }
//            );
//
//            _alertView.setCancelable(true).show();
//
//        } else {
//            ToastUtils.showShort("未获取到电话信息");
//        }
//    }


    //做测试添加自定义的友盟推送
//    private Notification getNotificationMySelf(Context _context, UMessage _uMessage) {
//
//        //2021年6月8日10:10:14 如果将来自定义通知栏就放开代码
//        //如果发现是报修工单的类型，那末就使用自定义的通知类型。
//
//        //第一种方式：存在可用的文件
//        //Uri soundUri = Uri.parse("android.resource://com.dgj.propertysmart/raw/" + _soundFileName);
//        //Uri soundUri = Uri.parse("android.resource://com.dgj.propertysmart/raw/" + _soundFileName);
//        Uri soundUri = Uri.parse(SOUND_PATH);
//
//        //第二种方式：废弃不用的
//        //Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.repairorderreminder);
//        //LogUtils.d("itchen---sound---->" + soundUri);
//        //---------------------------------------------------------------------------------------------------------
//        //暂时关闭第一段代码---------------------------------------------------------------------------------------------------------------------------------------
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//
//            //原始代码
//            //NotificationChannel channel = new NotificationChannel("Default", "Default_Channel", NotificationManager.IMPORTANCE_HIGH);
//            NotificationChannel channel = new NotificationChannel("my_repair_create", "my_repair_create_channel", NotificationManager.IMPORTANCE_HIGH);
//
//            //测试用
//            channel.setSound(soundUri, Notification.AUDIO_ATTRIBUTES_DEFAULT);
//
//            channel.enableLights(true);//设置闪光灯
//            //channel.enableVibration(true);//设置震动
//            //channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
//            NotificationManager notificationManager = (NotificationManager) _context.getSystemService(Context.NOTIFICATION_SERVICE);
//
//            if (notificationManager != null) {
//                notificationManager.createNotificationChannel(channel);
//            }
//
//        }
//
//        NotificationCompat.Builder builder = new NotificationCompat.Builder(_context, "my_repair_create");
//        //设置大图标
//        builder.setLargeIcon(BitmapFactory.decodeResource(Utils.getApp().getResources(), R.mipmap.ic_launcher));
//        //设置小图标
//        builder.setSmallIcon(R.drawable.umeng_push_notification_default_small_icon);
//
//        RemoteViews myNotificationView = new RemoteViews(_context.getPackageName(), R.layout.notification_view);
//
//        //设置推送时间： Map<String, String> mapExtra
//        if (_uMessage.extra != null) {
//            myNotificationView.setTextViewText(R.id.notification_createtime, _uMessage.extra.get("pushTime"));//取到时间
//        } else {
//            myNotificationView.setTextViewText(R.id.notification_createtime, TimeUtilSer.getNow());//取到时间 当前的，不能让该值空着。
//        }
//
//        myNotificationView.setTextViewText(R.id.notification_title, _uMessage.title);
//        myNotificationView.setTextViewText(R.id.notification_text, _uMessage.text);
//
//        builder.setContent(myNotificationView)//
//                .setSmallIcon(R.mipmap.ic_launcher)//系统默认
//                .setSound(soundUri)//
//                .setTicker(_uMessage.ticker)//
//                .setAutoCancel(true);//
//
//        //Notification curNotification = builder.build();
//
//        //--------------------------------------------------------------------------------------------------------------------------------------
//        //测试代码---正式代码删掉
//        //ImageView imageView = myNotificationView.get
//        //系统默认
//        //myNotificationView.setImageViewBitmap(R.id.notification_large_icon1,//
//        //BitmapUtil.drawableToBitamp(ContextCompat.getDrawable(Utils.getApp(), R.drawable.umeng_push_notification_default_large_icon)));
//        //myNotificationView.setImageViewBitmap(R.id.notification_large_icon1, R.mipmap.ic_launcher);.
//        //系统默认
//        //myNotificationView.setImageViewResource(R.id.notification_small_icon, getSmallIconId(context, msg));
//        //--------------------------------------------------------------------------------------------------------------------------------------
//
//        return builder.build();
//
//    }


    /**
     * 工单派单详情 抽取的：如果是从工单统计 进入到工单详情的，那末就不给按钮修改为灰色和不可用的状态
     */
    public static void RoundTextViewButtonModifyGray(RoundTextView button) {

        if (button != null) {

            Delivery.getInstance().post(new Runnable() {

                @Override
                public void run() {

                    button.getDelegate().setBackgroundColor(ColorUtils.getColor(R.color.gray14));
                    button.getDelegate().setBackgroundPressColor(ColorUtils.getColor(R.color.gray10));

                    button.getDelegate().setStrokeColor(ColorUtils.getColor(R.color.gray14));
                    button.getDelegate().setStrokePressColor(ColorUtils.getColor(R.color.gray10));

                    button.setOnClickListener(new ClickUtils.OnDebouncingClickListener() {

                        @Override
                        public void onDebouncingClick(View v) {

                            ToastUtils.showShort(ConstantSign.TEXT_NOT_EDITABLE);

                            //LogUtils.d("itchen----消耗点击事件的内容");

                        }
                    });

                }
            });

        }
    }

    /**
     * 重新绘制帮助布局的高度
     *
     * @param textView
     * @param number
     */
    public static void method_draw_height(TextView textView, int number) {

        //==============================================================================================
        final ViewGroup.LayoutParams layoutParams = textView.getLayoutParams();
        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        layoutParams.height = ScreenUtils.getScreenHeight() / number;
        textView.setLayoutParams(layoutParams);
        //==============================================================================================

    }

    /**
     * @param context     跳转到对应的市场详情
     * @param packageName
     */
    public static void goToMarket(Context context, String packageName) {

        //这种比较普遍的适合 华为和小米手机；有待优化；

        Uri uri = Uri.parse("market://details?id=" + packageName);
        Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
        try {
            context.startActivity(goToMarket);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();
        }

    }


    //一个正常的json内容
    /*{
        "body": {
        "after_open": "go_custom",
                "custom": "MY_REPAIR_CREATE",
                "play_lights": "true",
                "play_sound": "true",
                "play_vibrate": "true",
                "sound": "2021101911043700936417",
                "text": "工单池有新增工单，工单号为【GD-2021-10-23-0004】",
                "ticker": "物业报修",
                "title": "物业报修"
    },
        "display_type": "notification",
            "extra": {
        "isUrlSound": "1",
                "open": "MY_REPAIR_CREATE",
                "repairNo": "GD-2021-10-23-0004",
                "soundUrl": "http://222.222.17.184:8881/resource//push/sound/20211019/2021101911043700936417.mp3"
    },
        "msg_id": "uudafw1163498424402501"
    }*/


    /**
     * java 从字符串中提取6位手机验证码
     *
     * @param content
     * @return
     */
    public String getNumber(String content) {

        Pattern pattern2 = Pattern.compile("\\d{6}");
        Matcher matcher = pattern2.matcher(content);
        while (matcher.find()) {
            return matcher.group(0);
        }
        return "";
    }

    /**
     * 在字符串之中提取11位数字
     *
     * @param content
     * @return
     */
    public String getNumberPhone(String content) {

        Pattern pattern2 = Pattern.compile("\\d{11}");
        Matcher matcher = pattern2.matcher(content);
        while (matcher.find()) {
            return matcher.group(0);
        }
        return "";
    }


    /**
     * 在字符串之中提取出手机号
     *
     * @param sParam
     * @return
     */
    public String getPhone(String sParam) {
        if (sParam.length() <= 0)
            return "";
        Pattern pattern = Pattern.compile("(1|861)    (3|5|8)\\d{9}$*");
        Matcher matcher = pattern.matcher(sParam);
        StringBuffer bf = new StringBuffer();
        while (matcher.find()) {
            bf.append(matcher.group()).append(",");
        }
        int len = bf.length();
        if (len > 0) {
            bf.deleteCharAt(len - 1);
        }
        return bf.toString();
    }


//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//    public class regax {
//        public static void main(String[] args) {
//            String textContext="我的手机号码为:18800000000,请惠存！！！";
//            String phoneNum = getPhoneNum(textContext);
//            System.out.println(phoneNum);//18800000000
//        }
//        //提取文本手机号
//        public static String getPhoneNum(String text){
//            String regex="[\\d]{11}";
//            Pattern compile = Pattern.compile(regex);
//            Matcher matcher = compile.matcher(text);
//            String result="";
//            while (matcher.find()){
//                result+=","+matcher.group();
//            }
//            return result.replaceFirst(",","");
//        }
//    }


//    String str = "aaabbbcc13809148338eedfsfsf15702957315ksfss;13571708019fsdfk15114809485sfksfsf;sk;sfkskf;sfsk";
//    String regex = "[1][358]\\d{9}";
//    Pattern p = Pattern.compile(regex);
//    Matcher matcher = p.matcher(str);
//		while(matcher.find()){
//        String group = matcher.group();
//        System.out.println(group);
//    }

    //
//     获取 新的隐私政策的接口内容；
//
    public static void getNewPrivacyAgreement(Context mContext, Activity mActivityInstance) {

        HashMap<String, Object> hashMapParameter = new HashMap<>();
        //测试代码
        //hashMapParameter.put("uid", MMKV.defaultMMKV().decodeString(ConstantApi.P_UUID)+ConstantApi.TEST_ADD_UUID);//uuid

        hashMapParameter.put(Parameterkey.uid, MMKV.defaultMMKV().decodeString(ConstantSign.P_UUID_UNIQUEDEVICEID_ANDROIDID, DeviceUtils.getUniqueDeviceId()));//uuid
        hashMapParameter.put(Parameterkey.type, ConstantSign.PRIVACYAGREEMENT_CLOUDSTEWARD);//标识是从 管家物业 过去的隐私协议

//------------------------------------------------------------------------------------------------------------
        //如果为空字符串 也是会上传的如下格式
//        hashMapParameter.put(Parameterkey.uid, "");//uuid
//        hashMapParameter.put(Parameterkey.type, "");//标识是从 管家物业 过去的隐私协议
//        {
//            "type":"",
//                "uid":""
//        }

//        hashMapParameter.put(Parameterkey.uid, null);//uuid
//        hashMapParameter.put(Parameterkey.type, ConstantApi.PRIVACYAGREEMENT_CLOUDSTEWARD);//标识是从 管家物业 过去的隐私协议
//        {
//            "type":"cloudSteward",
//                "uid":null
//        }

//        hashMapParameter.put(Parameterkey.uid, null);//uuid
//        hashMapParameter.put(Parameterkey.type, ConstantApi.PRIVACYAGREEMENT_CLOUDSTEWARD);//标识是从 管家物业 过去的隐私协议
//        {
//            "type":"cloudSteward"
//        }
        //------------------------------------------------------------------------------------------------------------

        AddLogUpLoadInfo addLogUpLoadInfo = new AddLogUpLoadInfo();
        addLogUpLoadInfo.setActivity(mActivityInstance);
        addLogUpLoadInfo.setWhat(ConstantApi.WHAT_GAINDATAS_FOR_NEWPRIVACYAGREEMENT);//请求数字标识
        addLogUpLoadInfo.setUrlPath(ApiService.getSignStateUrl);//url地址
        addLogUpLoadInfo.setRequestMethod(ConstantSign.REQUEST_METHOD_POST);//POST 或者 GET
        addLogUpLoadInfo.setToastToUser(false);
        addLogUpLoadInfo.setHashMapParameter(hashMapParameter);

        //做界面展示给用户的
        NetworkManager.getInstance().initRetrofitRxJava()
                .create(ApiService.class)
                .getSignState(RequestBody.create(JSON.toJSONString(hashMapParameter, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue), MediaType.parse(ApiService.HEADER_JSON)))
                .compose(new ResponseTransformer<>(addLogUpLoadInfo,
                        new ApiRequestSubListener<Integer>(ConstantApi.IS_ACTIVITY_ITSELF, (ErrorActivity) mActivityInstance) {
                            @Override
                            public void handlerSomeThingNotSuccessDataForItSelf(int what_method, String serverCode, String serverMessage) {
                                //super.handlerSomeThingNotSuccessDataForItSelf(what_method, serverCode, serverMessage);

                                //如果它有问题，那么是要检测用户更新的：
                                //但是【用户更新APP】的逻辑 仍然是有效的；
                                SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement = //
                                        new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);//
                                EventBus.getDefault().post(singleHomeNewPrivacyAgreement);

                            }

                        }))
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer privacyAgreementIntegerValue) throws Exception {

                        //Integer privacyAgreementIntegerValue = response.succeed().getData();

                        //LogUtils.d("itchen--getSignState---接口获取的 是否有【新的隐私政策/用户是否同意新隐私政策】-privacyAgreementIntegerValue=" + privacyAgreementIntegerValue);

                        if (privacyAgreementIntegerValue != null) {

                            //------------------------------------------------------------------------------------------------------------------------------
                            //核心弹窗新的隐私协议内容；
                            //SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement = new SingleHomeNewPrivacyAgreement(_actionFlag);
                            //这种写法可以便于调试：
                            SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement =//
                                    new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_GETNEW_PRIVACY_AGREEMENT_SENDTO_HOMEMAINACTIVITY);
                            singleHomeNewPrivacyAgreement.setCurrentStateValue(privacyAgreementIntegerValue);

                            //这里不传递值内容；  为了标识容易：EVENTBUS_GETNEW_PRIVACY_AGREEMENT_SENDTO_HOMEMAINACTIVITY
                            EventBus.getDefault().post(singleHomeNewPrivacyAgreement);
                            //------------------------------------------------------------------------------------------------------------------------------


                        } else {

                            //发送日志添加。这里不能做提示；因为是首页弹窗广告；不能提示
                            //如果它有问题，那么是要检测用户更新的：
                            //但是【用户更新APP】的逻辑 仍然是有效的；
                            SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement = //
                                    new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);//
                            EventBus.getDefault().post(singleHomeNewPrivacyAgreement);

                        }

                    }

                    //自定义

                }, new ErrorConsumer() {
                    @Override
                    protected void error(ApiException e) {

                        //这里的处理逻辑是让用户检测更新APP的
                        //如果它有问题，那么是要检测用户更新的：
                        //但是【用户更新APP】的逻辑 仍然是有效的；
                        SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement = //
                                new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);//
                        EventBus.getDefault().post(singleHomeNewPrivacyAgreement);

                    }
                });
    }

    //     **
//     * 上传用户已经点击了【同意】的内容
//     *
    public static void gainDatasUploadSetSignState(Context mContext, //
                                                   Activity mActivityInstance, //
                                                   ApiRequestSubListener _apiRequestSubListener) {

        HashMap<String, Object> hashMapParameter = new HashMap<>();
        //做测试的uuid
        //hashMapParameter.put("type", ConstantApi.PRIVACYAGREEMENT_CLOUDSTEWARD + ConstantApi.TEST_ADD_UUID);//做测试的uuid
        hashMapParameter.put(Parameterkey.type, ConstantSign.PRIVACYAGREEMENT_CLOUDSTEWARD);//标识是从 管家物业 过去的隐私协议

        if (!TextUtils.isEmpty(MMKV.defaultMMKV().decodeString(ConstantSign.P_UUID_UNIQUEDEVICEID_ANDROIDID, DeviceUtils.getUniqueDeviceId()))) {
            hashMapParameter.put(Parameterkey.uid, MMKV.defaultMMKV().decodeString(ConstantSign.P_UUID_UNIQUEDEVICEID_ANDROIDID, DeviceUtils.getUniqueDeviceId()));//uuid
        } else {
            if (!TextUtils.isEmpty(DeviceUtils.getUniqueDeviceId())) {
                hashMapParameter.put(Parameterkey.uid, DeviceUtils.getUniqueDeviceId());//uuid
            } else {
                hashMapParameter.put(Parameterkey.uid, DeviceUtils.getAndroidID());//uuid
            }
        }

        AddLogUpLoadInfo addLogUpLoadInfo = new AddLogUpLoadInfo();
        addLogUpLoadInfo.setActivity(mActivityInstance);
        addLogUpLoadInfo.setWhat(ConstantApi.WHAT_GAINDATAS_FOR_NEWPRIVACYAGREEMENT_SETSIGNSTATE);
        addLogUpLoadInfo.setUrlPath(ApiService.setStateUrl);
        addLogUpLoadInfo.setRequestMethod(ConstantSign.REQUEST_METHOD_POST);
        addLogUpLoadInfo.setToastToUser(false);
        addLogUpLoadInfo.setHashMapParameter(hashMapParameter);

        NetworkManager.getInstance().initRetrofitRxJava()
                .create(ApiService.class)
                .setSignState(RequestBody.create(JSON.toJSONString(hashMapParameter, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue), MediaType.parse(ApiService.HEADER_JSON)))
                .compose(new ResponseTransformer(addLogUpLoadInfo,
                        _apiRequestSubListener))//
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean privacyAgreementBooleanValue) throws Exception {

//                        {
//                                "code":"20000",
//                                "data":true,
//                                "message":"success"
//                        }

                        //响应的数据内容

                        if (privacyAgreementBooleanValue != null) {

                            if (privacyAgreementBooleanValue) {

                                //LogUtils.d("itchen---用户点击了【同意-新的隐私政策】-并且，提交成功，--那么可以执行 调用【首页获取新的APP的更新接口逻辑了】");

                                if (mActivityInstance instanceof LoginCarActivity) {
                                    //LogUtils.d("itchen------【onSucceed 20000】-----表明 用户 是在【首次安装并且在登录界面点击了同意】，这时候HomeActivity还没有加载出来，不能弹活动广告图");
                                    //如果发现传递的Activity是从登录页面过来的，就表明是：用户首次安装，并且在首次 提交了
                                    return;
                                }

                                //------------------------------------------------------------------------------------------------------------------------------
                                //这个时候用户已经点击了【同意】隐私政策，那么就需要 告知用户 可以进行APP的升级了；
                                //这种写法可以便于调试：
                                SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement =//
                                        new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);

                                //这里不传递值内容；  为了标识容易：EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY
                                EventBus.getDefault().post(singleHomeNewPrivacyAgreement);
                                //------------------------------------------------------------------------------------------------------------------------------

                            }

                        } else {

                            //发送日志添加。这里不能做提示；因为是首页弹窗广告；不能提示

                            if (mActivityInstance instanceof LoginCarActivity) {
//                                LogUtils.d("itchen------【onSucceed 20000】-----privacyAgreementBooleanValue是空值，所以如果是在【登录页】那么就不用获取更新的内容，");
                                return;
                            }

                            //------------------------------------------------------------------------------------------------------------------------------
                            //这个时候用户已经点击了【同意】隐私政策，那么就需要 告知用户 可以进行APP的升级了；
                            //这种写法可以便于调试：
                            SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement =//
                                    new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);
                            EventBus.getDefault().post(singleHomeNewPrivacyAgreement);
                            //------------------------------------------------------------------------------------------------------------------------------

                        }

                    }
                }, new ErrorConsumer() {//它也是在主线程的
                    @Override
                    protected void error(ApiException e) {

//                        if (!ObjectUtils.isEmpty(e)) {
//                            LogUtils.d(ConstantApi.LOGCAT_NOMAL + e.getLocalizedMessage());
//                        }


                        if (mActivityInstance instanceof LoginCarActivity) {
                            return;
                        }

                        //------------------------------------------------------------------------------------------------------------------------------
                        //这个时候用户已经点击了【同意】隐私政策，那么就需要 告知用户 可以进行APP的升级了；
                        //这种写法可以便于调试：
                        SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement =//
                                new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);
                        EventBus.getDefault().post(singleHomeNewPrivacyAgreement);
                        //------------------------------------------------------------------------------------------------------------------------------

                    }
                });

    }


//    /**
//     * 添加 新的隐私政策弹窗
//     */
//    public static void getNewPrivacyAgreementSlowly(final Context _context,//上下文
//                                                    final Activity _activity, //上下文 可以为空
//                                                    CompositeDisposable _compositeDisposable) {//监听器
//
//        _compositeDisposable.add(Observable.timer(ConstantApi.UPDATE_GETAPP_PRIVACYAGREEMENT_DIALOG, TimeUnit.MILLISECONDS)
//                .subscribeOn(AndroidSchedulers.mainThread())//
//                .observeOn(AndroidSchedulers.mainThread())//
//                //.compose(_activity.bindUntilEvent(FragmentEvent.DESTROY))//
//                .subscribe(new Consumer<Long>() {
//                    @Override
//                    public void accept(Long aLong) throws Exception {
//
//                        //LogUtils.d("itchen----执行到了要处理【新的隐私政策的逻辑】---添加 处理 新的隐私政策 内容---");
//
//                        //需要传递小区id的
//                        //添加处理未读消息的接口 EVENTBUS_GETNEW_PRIVACY_AGREEMENT_SENDTO_HOMEMAINACTIVITY
//                        //getNewPrivacyAgreement(_context, _activity, _session, _apiRequestSubListener, _actionFlag);
//                        method_HandlerPrivacyAgreementDialogShowOrHide(_context, _activity);
//
//                    }
//                }));
//
//    }

//    /**
//     * 添加获取社区列表信息的工具方法
//     */
//    public static void getCommunityInfos(BaseImmersionFragment fragmentClamour) {
//
//        HashMap<String, Object> hashMapParameter = new HashMap<>();
//        hashMapParameter.put(Parameterkey.key, Parameterkey.null_post);
//
//        AddLogUpLoadInfo addLogUpLoadInfo = new AddLogUpLoadInfo();
//        addLogUpLoadInfo.setActivity(fragmentClamour.getActivity());
//        addLogUpLoadInfo.setWhat(ConstantApi.WHAT_GETCOMMUNITYBYCITYID);//请求数字标识
//        addLogUpLoadInfo.setUrlPath(ApiService.getCommunityListByCustomerIdUrl);//url地址 -这个是活的
//        addLogUpLoadInfo.setRequestMethod(ConstantSign.REQUEST_METHOD_POST);//POST 或者 GET
//        addLogUpLoadInfo.setToastToUser(false);//展示给用户的标志
//        addLogUpLoadInfo.setHashMapParameter(hashMapParameter);
//
//        //做界面展示给用户的
//        NetworkManager.getInstance()//
//                .initRetrofitRxJava()//
//                .create(ApiService.class)//
//                .getCommunityByPurview()//不上传参数,Get接口没有参数的。
//                .compose(fragmentClamour.bindUntilEvent(FragmentEvent.DESTROY))//
//                .compose(new ResponseTransformer<>(addLogUpLoadInfo,
//                        new ApiRequestSubListener<ArrayList<CommunityBean>>(ConstantApi.IS_FRAGMENT_ITSELF, fragmentClamour) {//
//                            @Override
//                            public void handlerSomeThingNotSuccessDataForItSelf(int what_method, String serverCode, String serverMessage) {
//                                super.handlerSomeThingNotSuccessDataForItSelf(what_method, serverCode, serverMessage);
//                            }
//                        }))
//                .flatMap(new Function<ArrayList<CommunityBean>, ObservableSource<CommunityBean>>() {
//                    @Override
//                    public ObservableSource<CommunityBean> apply(ArrayList<CommunityBean> communityBeans) throws Throwable {
//                        //走到这里 其实是已经执行完毕20000了
//                        //LogUtils.d(ConstantApi.LOGCAT_NOMAL + "走到这里是逻辑成功");
//                        return Observable.fromIterable(communityBeans);
//                    }
//                })
//                .subscribe(new Consumer<CommunityBean>() {
//                    @Override
//                    public void accept(CommunityBean communityBeanItem) throws Exception {
//                        if (communityBeanItem != null) {
//                            //LogUtils.d(ConstantApi.LOGCAT_NOMAL + "-插入的值内容-->" + communityBeanItem.getCommunityId() + "-->" + communityBeanItem.getCommunityName());
//                            //做本地的数据的缓存--不是空缓存真实,这里需要替换，不然多个用户登录 会有多个
//                            CommunityDaoManager.getInstance().insertOrReplaceCommunityEntity(//
//                                    new CommunityEntity(Long.parseLong(communityBeanItem.getCommunityId()),//
//                                            communityBeanItem.getCommunityId(),//
//                                            communityBeanItem.getCommunityName()));//
//                        }
//                    }
//                }, new ErrorConsumer() {
//
//                    @Override
//                    protected void error(ApiException e) {
//                        //
//                    }
//                });
//
//    }


    /**
     * 控制 隐私政策有新的弹出
     */
    public static void method_HandlerPrivacyAgreementDialogShowOrHide(final Context _context,//上下文
                                                                      final Activity _activity) {//标识内容，也可以不携带；

        //int todaytest = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
        //LogUtils.d("itchen--onEventMainThreadEventAdDialog--todaytest--->" + todaytest);
        //itchen---todaytest--->102

        //这里是有一个逻辑就是一天时间，仅仅弹窗一次，跟着APP打开走，而不是跟着账号走。
        //每次启动都要设置：为show
        String privacyagreement_show_or_hide = MMKV.defaultMMKV().decodeString(ConstantSign.P_PRIVACYAGREEMENT_DIALOG_SHOW_OR_HIDE);
        //LogUtils.d("itchen--privacyagreement_show_or_hide-->新的隐私政策弹窗---标志是 =" + privacyagreement_show_or_hide);

        if (TextUtils.equals(privacyagreement_show_or_hide, ConstantSign.P_PRIVACYAGREEMENT_DIALOG_SHOW)) {//如果隐私政策的弹窗 是【可弹出/能弹出/是即将弹出】的

            //特别注意：这一行代码 请勿删除，做测试用
            //int today = Calendar.getInstance().get(Calendar.DAY_OF_YEAR) + 4;//这个是做测试 往后推迟一天
            //获取今天的日子--正式上线的操作如下
            int today = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
            //LogUtils.d("itchen---method_HandlerPrivacyAgreementDialogShowOrHide--today--->" + today);
            //itchen---today--->102

            int lastDay = MMKV.defaultMMKV().decodeInt(ConstantSign.P_PRIVACYAGREEMENT_DIALOG_LASTDAY);
            //LogUtils.d("itchen---method_HandlerPrivacyAgreementDialogShowOrHide--lastDay--->" + lastDay);
            //itchen---lastDay--->-1

            int frequency = MMKV.defaultMMKV().decodeInt(ConstantSign.P_PRIVACYAGREEMENT_DIALOG_FREQUENCY);
            //LogUtils.d("itchen--method_HandlerPrivacyAgreementDialogShowOrHide---调用【是否有新隐私政策接口】--frequency--->" + frequency);
            //itchen---frequency--->-1

            if (today == lastDay) {//是同一天

                if (frequency < 1) {//将来这里是可以随意调整的例如N次执行

                    //TODO执行拦截页操作；
                    //LogUtils.d("itchen-----method_HandlerPrivacyAgreementDialogShowOrHide-----: " + "同一天执行次数" + frequency);

                    frequency++;

                    MMKV.defaultMMKV().encode(ConstantSign.P_PRIVACYAGREEMENT_DIALOG_LASTDAY, lastDay);
                    MMKV.defaultMMKV().encode(ConstantSign.P_PRIVACYAGREEMENT_DIALOG_FREQUENCY, frequency);//

                    //代码勿删除：其实这里也是要让放开的，只是我得代码里让执行一次，将来执行3次，是要有如下一行的；只能放在测试用；
                    // TODO: 2022-08-06 14:43 这里设置调用是否有新的隐私政策的接口；
                    //getNewPrivacyAgreement(_context, _activity);

                } else {

                    //TODO执行别的操作
                    //LogUtils.d("itchen-----method_HandlerPrivacyAgreementDialogShowOrHide-----: " + "超过 规定N 次 的展示，不能再调用是否有新的隐私政策接口；但是广告要调用 ");

                    //================================================================================================================================
                    //但是【广告逻辑】 和 【用户更新APP】的逻辑 仍然是有效的；
                    SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement = //
                            new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);//
                    EventBus.getDefault().post(singleHomeNewPrivacyAgreement);

                    //================================================================================================================================

                }

            } else {//【不是同一天，是必然要执行一次的】

                //修改SharePreferences日期为当前日期，并记录次数一次； 意思是要调用一次【是否有新的隐私政策的接口】
                frequency = 1;

                //LogUtils.d("itchen-----method_HandlerPrivacyAgreementDialogShowOrHide-----: " + "不是同一天执行，那么重置 次数/频率为=" + frequency + "--并且设置日期为今天");
                //itchen-----onClick-----: 不是同一天执行次数1

                //把今天存起来；留着明天用 把today赋值给lastDay 让today == lastDay
                MMKV.defaultMMKV().encode(ConstantSign.P_PRIVACYAGREEMENT_DIALOG_LASTDAY, today);

                //给今天的 操作频率存起来
                MMKV.defaultMMKV().encode(ConstantSign.P_PRIVACYAGREEMENT_DIALOG_FREQUENCY, frequency);

                // : 2022-08-06 14:43 这里设置调用是否有新的隐私政策的接口；
                getNewPrivacyAgreement(_context, _activity);

            }

        } else {

//            LogUtils.d("itchen--method_HandlerPrivacyAgreementDialogShowOrHide-->标志是  【不能】再去调用有新的隐私政策接口,value=" + privacyagreement_show_or_hide);

            //如果它为空，那么接着正常的执行更新APP的逻辑内容；
            //但是【用户更新APP】的逻辑 仍然是有效的；
            SingleHomeNewPrivacyAgreement singleHomeNewPrivacyAgreement = //
                    new SingleHomeNewPrivacyAgreement(ConstantApi.EVENTBUS_DOSOMETHINGS_AFTER_NEWPRIVACYAGREEMENT_SENDTO_HOMEMAINACTIVITY);//
            EventBus.getDefault().post(singleHomeNewPrivacyAgreement);

        }

    }


    /**
     * 单独获取隐私政策的弹窗的布局内容，因为现在2处通用，所以单独抽出
     */
    public static View getViewCustomForPrivacyAgreement(Context mContext) {

        //获取一个自定义的 view 内容
        LayoutInflater inflaterInCustom = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View viewCustom = inflaterInCustom.inflate(R.layout.layouttextsecrecyturl, null);

        /*String _contentResult = StringUtils.getString(R.string.kongge4)+ "请您在使用我们的产品服务前仔细阅读《用户协议》及《隐私政策》。"//
                + "您点击【同意】，即表示您已阅读并同意以上条款。"//
                + AppUtils.getAppName() + "将全力保障您的合法权益与信息安全，并将持续为您提供更优质的服务。";*/

        //内部的文本内容
        TextView textViewOneTopSecrecy = (TextView) viewCustom.findViewById(R.id.textviewonetopsecrecy);

        String contentInside = "您点击【同意】,即表示您已阅读并同意以上条款。请您充分了解在使用本软件过程中我们可能收集、使用您的个人信息情形，" +
                "希望您着重关注：" + StringUtils.getString(R.string.testtabhuh) +
                "1：为了消息推送，我们采用友盟SDK，采集您的设备（IMEI/MAC/Android ID/IDFA/OAID/OpenUDID/GUID/SIM卡IMSI/ICCID 信息等。" + StringUtils.getString(R.string.testtabhuh) +
                "APP内【设置-关于我们】有【隐私政策】的常驻入口，我们将全力保障您的合法权益与信息安全,并将持续为您提供更优质的服务。";

        SpanUtils.with(textViewOneTopSecrecy).append("请您在使用产品前仔细阅读")//
                .append("《隐私政策》").setClickSpan(ColorUtils.getColor(R.color.bluepicker), true, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        //LogUtils.d("itchen---->点击了 隐私政策");
                        //MMKV.defaultMMKV().encode(ConstantApi.P_SECRECYTURL_AGREE, false);
                        //CommUtils.methodSecrecytUrl(mContext);

                        if (MMKV.defaultMMKV().decodeBool(ConstantSign.P_SECRECYTURL_AGREE)) {
                            //LogUtils.d("itchen--点击《隐私政策》-用户 已经 点击【同意--隐私政策】");
                            CommUtils.methodSecrecytUrl(mContext);//隐私政策

                        } else {
                            //LogUtils.d("itchen--点击《隐私政策》-用户 没有 点击【同意--隐私政策】");
                            CommUtils.methodSecrecytUrl_loadLocal(mContext);//隐私政策
                        }

                    }
                }).append("及")//
                .append("《服务协议》").setClickSpan(ColorUtils.getColor(R.color.bluepicker), true, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        //LogUtils.d("itchen---->点击了用户协议");
                        //MMKV.defaultMMKV().encode(ConstantApi.P_SECRECYTURL_AGREE, false);
                        //CommUtils.methodAgreementUrl(mContext);

                        //依据用户有无点击【同意】隐私政策判断，如果没有点击同意，那么点击查看的就是本地的html内容，
                        if (MMKV.defaultMMKV().decodeBool(ConstantSign.P_SECRECYTURL_AGREE)) {
                            //LogUtils.d("itchen---点击《服务协议--用户 已经 点击【同意--隐私政策】");
                            CommUtils.methodAgreementUrl(mContext);//用户协议

                        } else {
                            //LogUtils.d("itchen---点击《服务协议》--用户 没有 点击【同意--隐私政策】");
                            CommUtils.methodAgreementUrl_loadLocal(mContext, ConstantSign.TEXTURL_USER_AGREEMENT);//用户协议
                        }

                    }
                }).append(contentInside)
                .create();

        return viewCustom;
    }

    /**
     * 查看新的隐私协议的弹窗内容
     */
    public static void methodShowAgreementDialog(Context mContext,//
                                                 Activity mActivity, //
                                                 View viewCustom,//
                                                 ApiRequestSubListener apiRequestSubListener) {//

        //所有内容都配置完毕之后就弹窗提示用户隐私政策
//        if (materialDialogSecrecytUrl == null) {

        //如果  用户并没有点击【同意】，那么弹窗一直展示。
        //用户 是否 点击了【同意】
        //boolean isSecrecyturlAgree = MMKV.defaultMMKV().decodeBool(ConstantApi.SECRECYTURL_AGREE);
        //LogUtils.d("itchen----isSecrecyturlAgree----是否点击同意--->" + isSecrecyturlAgree);

        //boolean isFirstRun = SPUtils.getInstance().getBoolean(ConstantApi.ISFIRSTRUN);
        //LogUtils.d("itchen----isFirstRun----是否首次安装--->"+isFirstRun);

//            if ((!isSecrecyturlAgree)) {//如果用户是首次安装 并且 用户没有点击【同意】。

        //LogUtils.d("itchen----->用户 ： 没有 点击【同意】用户协议。");

        new MaterialDialog.Builder(mContext)
                //.title("欢迎使用" + AppUtils.getAppName())//
                .title(ConstantSign.PRIVACY_AGREEMENT_TITLE)//用户协议和隐私政策
                .customView(viewCustom, true)//填充自定义View
                .positiveText(ConstantSign.PRIVACY_AGREEMENT_AGREE)//"同意"
                .positiveColor(ColorUtils.getColor(R.color.red_pressed))//
                .negativeText(ConstantSign.PRIVACY_AGREEMENT_CLICK_LOOK)//查看隐私政策
                .neutralText(ConstantSign.PRIVACY_AGREEMENT_CLICK_NOT_USED)//暂不使用
                .onPositive(new MaterialDialog.SingleButtonCallback() {//
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {

                        //这里不用标记用户是否点击【同意】
                        //MMKV.defaultMMKV().encode(ConstantApi.SECRECYTURL_AGREE, true);
                        //LogUtils.d("itchen----->用户点击了 【同意 隐私协议】，那么 就关闭该弹窗的内容--并且上传接口。");

                        //直接调用接口
//                        gainDatasUploadSetSignState(mContext, //
//                                mActivity,//
//                                apiRequestSubListener);//

                    }
                })
                .onNegative(new MaterialDialog.SingleButtonCallback() {

                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {

                        //查看用户隐私政策的内容
                        //标识他还没有 点击同意，那么下次 应用resume的时候还是要重新提示的。
                        //2022年8月6日16:13:37 这里不能标记，因为不是首次安装的逻辑
                        //MMKV.defaultMMKV().encode(ConstantApi.SECRECYTURL_AGREE, false);

                        CommUtils.methodSecrecytUrl(mContext);


                    }
                }).onNeutral(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {

                        //2022年8月6日16:13:37 这里不能标记，因为不是首次安装的逻辑
                        //MMKV.defaultMMKV().encode(ConstantApi.SECRECYTURL_AGREE, false);

                        //不同意，我看别的APP有个内容提示，如果不同意就无法使用该软件
                        //点击不同意，不让弹窗消失 而是给个提示：
                        ToastUtils.showLong(ConstantSign.AGREEMENTSTRING_TIPS_TOAST);

                        //ToastUtils.setGravity(Gravity.CENTER, 0, 0);

                        //2022年1月28日16:00:15OPPO平台审核不通过，必须让退出应用
                        //一秒钟关闭之后 这个弹窗 又弹出。
                        //--------------------------------------------------------------------
                        //直接的退出APP
                        if (MianTaskManager.getInstance(mActivity) != null) {
                            MianTaskManager.getInstance(mActivity).finishAllActivity();
                        }

                        ActivityUtils.finishAllActivities();

                        if (!mActivity.isFinishing()) {
                            ActivityUtils.finishActivity(mActivity);
                        }

                        AppUtils.exitApp();
                        //--------------------------------------------------------------------

                    }
                }).cancelable(false).show();

        //设置字体大小
        //materialDialogSecrecytUrl.getActionButton(DialogAction.POSITIVE).setTextSize(15);

//        } else {
//            LogUtils.d("itchen----->用户：不是首次安装，并且，或者 已经 点击过【同意】用户协议。");
//        }
//        }

    }

    /**
     * 设置TextView的渐变色
     */
    public static void setTextViewStyles_workerButton(TextView textView) {

        //LinearGradient 前四个参修改可以有不同的方向；
        LinearGradient mLinearGradient = new LinearGradient(0, //
                0, //
                0, //
                textView.getPaint().getTextSize(), //
                //Color.parseColor("#FFD800"),//
                Color.parseColor("#FF9306"),//start
                Color.parseColor("#FE4B19"),//end
                Shader.TileMode.CLAMP);//

        textView.getPaint().setShader(mLinearGradient);

        textView.invalidate();

    }

    /**
     * 对高度和宽度进行统计 然后设置gridView的宽高。
     *
     * @param numColumns 设定行数
     * @param gridView
     */
    public static void calGridViewSumWH(int numColumns, GridView gridView) {

        // 获取GridView对应的Adapter

        ListAdapter listAdapter = gridView.getAdapter();

        if (listAdapter == null) {

            return;

        }

        int totalHeight = 0;

        int totalWidth = 0;

        for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目

            View listItem = listAdapter.getView(i, null, gridView);

            listItem.measure(0, 0); // 计算子项View 的宽高

            totalWidth = listItem.getMeasuredWidth();

            if ((i + 1) % numColumns == 0) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

                    totalHeight += listItem.getMeasuredHeight() + gridView.getVerticalSpacing(); // 统计所有子项的总高度

                } else {

                    totalHeight += listItem.getMeasuredHeight();

                }

            }

            if ((i + 1) == len && (i + 1) % numColumns != 0) {

                totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度

            }

        }

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {

            totalHeight += 20;

        }

        if (listAdapter.getCount() < numColumns) {

            gridView.setNumColumns(listAdapter.getCount());

        }

        ViewGroup.LayoutParams params = gridView.getLayoutParams();

        params.height = totalHeight;

        params.width = totalWidth * listAdapter.getCount();

        gridView.setLayoutParams(params);

    }


    /**
     * token丢失或者设备号为空
     */
    public static void errorTokenOrEqument(Activity activity, String statusCode, String message, Session _session, SequenceListener sequenceListener) {

        //{"code":"10005","data":"","message":"token不能为空!"}
        if (TextUtils.equals(statusCode, ConstantSign.RESPONSE_10005) //
                || TextUtils.equals(statusCode, ConstantSign.RESPONSE_10302)//设备号不能为空
                || TextUtils.equals(statusCode, ConstantSign.RESPONSE_10102)) {//token不存在

            // : 2022-10-28 08:53 主要界面不给提示，华为审核不通过
            if (!TextUtils.isEmpty(message)) {
                ToastUtils.showShort(message);
            }

            //确定是：code=10005&message=token不能为空！ 那么再次重新获取；
            CommUtils.getTokenInterface(NetworkManager.getInstance().getPublic_url_prefix(), activity, _session);

        } else {

            //继续做别的事情
            sequenceListener.doSomeThing();

        }

    }

    //卡券的弹窗逻辑,如果是餐券 是没有【发放原因的】
    public static MaterialDialog function_show_dialog_seeReason(int _flag_jumpfrom_where,//
                                                                Activity _activity,//
                                                                Context _context, //
                                                                CouponCustomerVo _couponCustomerVo, //
                                                                DoSomeThingListener _doSomeThingListener) {//

        View viewCard = View.inflate(_activity, R.layout.cardinfopopu, null);

        //其他逻辑找出
        //卡券的名称：
        String couponName = _couponCustomerVo.getCouponName();
        //核销状态 :是汉字形式的;
        String stateItem = _couponCustomerVo.getCouponStatusInfo();
        //卡券类型
        String couponTypeInfo = _couponCustomerVo.getCouponTypeInfo();
        //使用条件
        String couponLowAmountInfo = _couponCustomerVo.getCouponLowAmountInfo();
        //领取客户--姓名
        String userName = _couponCustomerVo.getUserName();
        //领取客户--手机号
        String phone = _couponCustomerVo.getPhone();
        //发放时间
        String time = _couponCustomerVo.getCreateTime();
        //卡券描述
        String couponDetail = _couponCustomerVo.getCouponDetail();
        //是否有发送原因
        String explain = _couponCustomerVo.getExplain();

        //卡券的名称
        TextView textViewCarName = (TextView) viewCard.findViewById(R.id.textviewcarnameinfo);
        //该车辆 使用卡券的状态:其实主要的是核销状态
        TextView textViewCarSmartState = (TextView) viewCard.findViewById(R.id.textviewcarsmartstateinfo);
        //卡券类型
        TextView textViewCardType = (TextView) viewCard.findViewById(R.id.textviewcardtypeinfo);
        //卡券使用条件
        TextView textViewCardUserKonw = (TextView) viewCard.findViewById(R.id.textviewcarduserkonwinfo);
        //领取卡券的用户的名称
        TextView textViewPerosonNameCarSmart = (TextView) viewCard.findViewById(R.id.textviewperosonnamecarsmartinfo);
        //手机号
        TextView textViewEditViewPhoneCarSmart = (TextView) viewCard.findViewById(R.id.textvieweditviewphonecarsmartinfo);
        //卡券描述
        TextView textViewCardDesInfo = (TextView) viewCard.findViewById(R.id.textviewcarddesinfopopu);
        //卡券发放的时间
        TextView textViewSmartTime = (TextView) viewCard.findViewById(R.id.textviewcarsmarttimeinfo);


        //发送优惠券的原因:如果原因不是空，那么原因整体布局展示。
        RelativeLayout relativeLayoutReasonInfo = (RelativeLayout) viewCard.findViewById(R.id.relativelayoutreasoninfopopu);
        //填充真实的发送优惠券的原因
        TextView textViewCarSendReason = (TextView) viewCard.findViewById(R.id.textviewcarsendreasoninfopopu);
        //右侧可以点击的详情布局
//        ImageView imageRightInfoClick = (ImageView) viewCard.findViewById(R.id.imagerightinfoclick);

        //如果是从餐券过来的，不显示
        if (_flag_jumpfrom_where == ExtraValue.VALUE_JUMP_FORM_CARD_MAIN_ACTIVITY) {
            CommUtils.setViewVisible(relativeLayoutReasonInfo);
        } else if (_flag_jumpfrom_where == ExtraValue.VALUE_JUMP_FORM_RICE_TICKET_OUT_ACTIVITY) {
            CommUtils.setViewGone(relativeLayoutReasonInfo);
        }

        //卡券名称
        CommUtils.setText(textViewCarName, couponName);
        //卡券状态
        CommUtils.setText(textViewCarSmartState, stateItem);
        //卡券类型
        CommUtils.setText(textViewCardType, couponTypeInfo);
        //使用条件
        CommUtils.setText(textViewCardUserKonw, couponLowAmountInfo);
        //领取客户-姓名
        CommUtils.setText(textViewPerosonNameCarSmart, userName);
        //客户手机号
        CommUtils.setText(textViewEditViewPhoneCarSmart, StringCodeUtils.mobileEncrypt(phone));
        //卡券描述
        CommUtils.setText(textViewCardDesInfo, couponDetail);
        //卡券发放时间
        CommUtils.setText(textViewSmartTime, time);

        //------------------------------------------------------------

//            if (!TextUtils.isEmpty(explain)) {
//                CommUtils.setViewVisible(relativeLayoutReasonInfo);
//                CommUtils.setText(textViewCarSendReason, explain);
//            } else {
//                CommUtils.setViewGone(relativeLayoutReasonInfo);
//            }

        CommUtils.setText(textViewCarSendReason, explain);


        RoundTextView textViewCardCancel = (RoundTextView) viewCard.findViewById(R.id.textviewcardinfocancelinfo);

        if (textViewCardCancel != null) {
            textViewCardCancel.setOnClickListener(new ClickUtils.OnDebouncingClickListener() {
                @Override
                public void onDebouncingClick(View v) {

                    // 此时 弹窗是已经被弹出的
//                    if (materialDialogCustomView != null) {
//                        materialDialogCustomView.dismiss();
//                    }

                    if (_doSomeThingListener != null) {
                        _doSomeThingListener.doSomeThing();

                        //主要是关闭弹窗内容。
//                        if (materialDialogCustomView != null) {
//                        materialDialogCustomView.dismiss();
//                    }

                    }

                    //直接关闭该页面整体的,因为不认证是没法儿用的
                    //methodBack();

                }
            });
        }

        return new MaterialDialog.Builder(_context)
                .customView(viewCard, false)
                .contentColor(ColorUtils.getColor(R.color.buttonnomcolor))//
                //.positiveText("确定")
                .positiveColor(ColorUtils.getColor(R.color.dark))
                //.negativeText("取消")
                .cancelable(true)
                .canceledOnTouchOutside(true)
                .show();

//        new MaterialDialog.Builder(_context)
//                .customView(viewCard, false)
//                .contentColor(ColorUtils.getColor(R.color.buttonnomcolor))//
//                //.positiveText("确定")
//                .positiveColor(ColorUtils.getColor(R.color.dark))
//                //.negativeText("取消")
//                .cancelable(true)
//                .canceledOnTouchOutside(true)
//                .show();

//        materialDialogCustomView = new MaterialDialog.Builder(_context)
//                .customView(viewCard, false)
//                .contentColor(ColorUtils.getColor(R.color.buttonnomcolor))//
//                //.positiveText("确定")
//                .positiveColor(ColorUtils.getColor(R.color.dark))
//                //.negativeText("取消")
//                .cancelable(true)
//                .canceledOnTouchOutside(true)
//                .show();


    }

    /**
     * Sometimes you want to adjust more options, it's done via {@link com.yalantis.ucrop.UCrop.Options} class.
     * 相机的裁剪，相册的裁剪 都可用的配置。
     *
     * @param uCrop - ucrop builder instance
     * @return - ucrop builder instance
     */
    public static UCrop advancedConfig(@NonNull UCrop uCrop) {

        UCrop.Options options = new UCrop.Options();

//        switch (mRadioGroupCompressionSettings.getCheckedRadioButtonId()) {
//            case R.id.radio_png:
//                options.setCompressionFormat(Bitmap.CompressFormat.PNG);
//                break;
//            case R.id.radio_jpeg:
//            default:
//                options.setCompressionFormat(Bitmap.CompressFormat.JPEG);
//                break;
//        }

        options.setCompressionFormat(Bitmap.CompressFormat.PNG);

//        options.setCompressionQuality(mSeekBarQuality.getProgress());

//        options.setHideBottomControls(mCheckBoxHideBottomControls.isChecked());
//        options.setFreeStyleCropEnabled(mCheckBoxFreeStyleCrop.isChecked());

        /*
        If you want to configure how gestures work for all UCropActivity tabs

        options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
        * */

        /*
        This sets max size for bitmap that will be decoded from source Uri.
        More size - more memory allocation, default implementation uses screen diagonal.

        options.setMaxBitmapSize(640);
        * */


       /*

        Tune everything (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧

        options.setMaxScaleMultiplier(5);
        options.setImageToCropBoundsAnimDuration(666);
        options.setDimmedLayerColor(Color.CYAN);
        options.setCircleDimmedLayer(true);
        options.setShowCropFrame(false);
        options.setCropGridStrokeWidth(20);
        options.setCropGridColor(Color.GREEN);
        options.setCropGridColumnCount(2);
        options.setCropGridRowCount(1);
        options.setToolbarCropDrawable(R.drawable.your_crop_icon);
        options.setToolbarCancelDrawable(R.drawable.your_cancel_icon);

        // Color palette
        options.setToolbarColor(ContextCompat.getColor(this, R.color.your_color_res));
        options.setStatusBarColor(ContextCompat.getColor(this, R.color.your_color_res));
        options.setToolbarWidgetColor(ContextCompat.getColor(this, R.color.your_color_res));
        options.setRootViewBackgroundColor(ContextCompat.getColor(this, R.color.your_color_res));
        options.setActiveControlsWidgetColor(ContextCompat.getColor(this, R.color.your_color_res));

        // Aspect ratio options
        options.setAspectRatioOptions(2,
            new AspectRatio("WOW", 1, 2),
            new AspectRatio("MUCH", 3, 4),
            new AspectRatio("RATIO", CropImageView.DEFAULT_ASPECT_RATIO, CropImageView.DEFAULT_ASPECT_RATIO),
            new AspectRatio("SO", 16, 9),
            new AspectRatio("ASPECT", 1, 1));
        options.withAspectRatio(CropImageView.DEFAULT_ASPECT_RATIO, CropImageView.DEFAULT_ASPECT_RATIO);
        options.useSourceImageAspectRatio();

       */

        return uCrop.withOptions(options);
    }


    //打开图片预览的逻辑BGAPhotoPickerUtil
    public static void photoPreviewIntent(Activity _activity, Context _context, BGANinePhotoLayout _currentClickNpl) {

        if (_currentClickNpl != null) {

//        File downloadDir = new File(Environment.getExternalStorageDirectory(), ConstantSign.BGAPHOTOPICKERDOWNLOAD);
//        File downloadDir = new File(PathUtils.getExternalAppFilesPath(), ConstantSign.BGAPHOTOPICKERDOWNLOAD);

            File downloadDir = new File(PathUtils.getExternalDcimPath(), ConstantSign.BGAPHOTOPICKERDOWNLOAD);
            FileUtils.createOrExistsDir(downloadDir);
            //获取相册的路径
            LogUtils.d(ConstantSign.LOGCAT_NOMAL + "downloadDir-->" + downloadDir);
            //itchen-->downloadDir-->/storage/emulated/0/DCIM/BGAPhotoPickerDownload

            BGAPhotoPreviewActivity.IntentBuilder photoPreviewIntentBuilder = new BGAPhotoPreviewActivity.IntentBuilder(_context);

            //预览图片时显示保存图片按钮
            if (true) {
                // 保存图片的目录，如果传 null，则没有保存图片功能
                photoPreviewIntentBuilder.saveImgDir(downloadDir);
            }

            if (_currentClickNpl.getItemCount() == 1) {
                // 预览单张图片
                photoPreviewIntentBuilder.previewPhoto(_currentClickNpl.getCurrentClickItem());

            } else if (_currentClickNpl.getItemCount() > 1) {
                // 预览多张图片
                photoPreviewIntentBuilder.previewPhotos(_currentClickNpl.getData())
                        .currentPosition(_currentClickNpl.getCurrentClickItemPosition()); // 当前预览图片的索引
            }

            _activity.startActivity(photoPreviewIntentBuilder.build());

        }
    }

    //设置通知权限
    public static void setNotification(Activity _activity, Context _context, XXPermissionsDialogDimss _permissionsDialogDimss, boolean isToastToUser) {

        //判断 android13
//        MaterialDialog _materialDialog = null;

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {

            boolean isCanAble = NotificationUtils.areNotificationsEnabled();

            if (isCanAble) {

                LogUtils.d(ConstantSign.LOGCAT_NOMAL + _context.getResources().getString(R.string.notification_has_open));

                if (isToastToUser) {
                    PopTip.show(_context.getResources().getString(R.string.notification_has_open)).iconSuccess();
                }

            } else {

                LogUtils.d(ConstantSign.LOGCAT_NOMAL + "即将打开设置权限");

//                MaterialDialog final_materialDialog1 = _materialDialog;
//                MaterialDialog _materialDialog = CommUtils.authorityRequest(_activity, ConstantSign.MATERIALDIALOG_AUTHORITY_CONTENT_POST_NOTIFICATIONS, new AuthorityCallbackListener() {
//                MaterialDialog final_materialDialogErrorActivity = _materialDialogErrorActivity;

                materialDialogTools = CommUtils.authorityRequest(_activity, ConstantSign.MATERIALDIALOG_AUTHORITY_CONTENT_POST_NOTIFICATIONS, new AuthorityCallbackListener() {
                    @Override
                    public void doSomeThing() {

                        if (materialDialogTools != null) {
                            _permissionsDialogDimss.dialogDimss(materialDialogTools);
                        } else {
                            LogUtils.d(ConstantSign.LOGCAT_NOMAL + "materialDialogTools--是空值-");
                        }

                        //检测通知权限没有打开：
                        MyNotificationUtils.requestNotificationListenerPermission(_activity);

                    }
                });
//                _materialDialog = _materialDialogErrorActivity;
            }

        } else {

            //打开通知权限
            //android13的
            if (!XXPermissions.isGranted(_activity, com.hjq.permissions.Permission.POST_NOTIFICATIONS)) {

//                CommUtils.checkMaterialDialog(_materialDialog);

//                MaterialDialog final_materialDialog = _materialDialog;

                materialDialogTools = CommUtils.authorityRequest(_activity, ConstantSign.MATERIALDIALOG_AUTHORITY_CONTENT_POST_NOTIFICATIONS, new AuthorityCallbackListener() {

                    @Override
                    public void doSomeThing() {

                        CommUtils.checkMaterialDialog(materialDialogTools);

                        XXPermissions.with(_activity)
                                // 适配分区存储应该这样写
                                //.permission(Permission.Group.STORAGE)
                                // 不适配分区存储应该这样写
//                              .permission(com.hjq.permissions.Permission.)//
                                .permission(com.hjq.permissions.Permission.POST_NOTIFICATIONS)//通知权限的打开
                                .interceptor(new PermissionInterceptor())
                                .request(new OnPermissionCallback() {

                                    @Override
                                    public void onGranted(@NonNull List<String> permissions, boolean allGranted) {

                                        if (!allGranted) {
                                            return;
                                        }

//                                      Toaster.show(String.format(getString(R.string.demo_obtain_permission_success_hint),
//                                                        PermissionNameConvert.getPermissionString(SettingActivity.this, permissions)));

                                        if (isToastToUser) {
                                            PopTip.show(_context.getResources().getString(R.string.notification_has_open)).iconSuccess();
                                        }

                                    }
                                });

                    }
                });

            } else {
                //retain
                if (isToastToUser) {
                    PopTip.show(_context.getResources().getString(R.string.notification_has_open)).iconSuccess();
                }
            }

        }

    }

}
